﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using Controller;
using Interfaces;

namespace GUI
{
    public partial class FrmEmma : Form
    {
        // Atributter
        private EmmaSystem system;
        private int tilstandMedarbejder = 0;
        private int tilstandKunde = 0;
        private int tilstandProjekt = 0;

        // Tilstands konstanter
        private const int NORMAL_TILSTAND = 1;
        private const int REDIGER_TILSTAND = 2;
        private const int OPRET_TILSTAND = 3;

        // Konstruktør
        public FrmEmma()
        {
            InitializeComponent();

            system = new EmmaSystem();
        }

        // Form-load hændelsen
        private void FrmEmma_Load_1(object sender, EventArgs e)
        {
            NormalTilstand_Bogfør();
            NormalTilstand_Medarbejder();
            NormalTilstand_Årsregnskab();
            NormalTilstand_Faktura();
            NormalTilstand_Kunde();
            NormalTilstand_Projekt();

            ListMedarbUpdate();
            NormalTilstand_Kunde();
            ListKundeUpdate();
            CboÅrUpdate();
            ListProjektKundeUpdate();
            ListProjektUpdate();
            cboUpdateProjektledere();
            ListPosteringUpdate();
            ListMedarbUpdate();
            CboUpdateProjektvalg();
            ListUpdateFaktura();

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        // Tab-index changed
        private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
        {
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        /************************ Region "Bogfør bilag" ************************/
        #region "Bogfør bilag"

        #region Tilstandsstyrring

        // Betingelser for normal-tilstand
        private void NormalTilstand_Bogfør()
        {
            txtBilagsNr.Visible = false;
            lblBilagsNr.Visible = false;
            txtPostBeløb.Visible = false;
            lblPostBeløb.Visible = false;
            lblPostBeskrivelse.Visible = false;
            txtPostBeskrivelse.Visible = false;
            lblPostDato.Visible = false;
            dtpPostDato.Visible = false;
            lblPosteringer.Visible = true;
            lstPosteringer.Visible = true;
            lblPosteringsType.Visible = true;
            cboPosteringsType.Visible = true;

            btnPostGem.Visible = false;
            btnPostAnnuller.Visible = true;
            btnPostFortryd.Visible = true;
            btnPostOpret.Visible = true;
            btnVisTypePoster.Visible = true;
            btnVisRapport.Visible = true;
        }

        // Betingelser for opret-tilstand
        private void OpretTilstand_Bogfør()
        {
            txtBilagsNr.Visible = true;
            lblBilagsNr.Visible = true;
            txtPostBeløb.Visible = true;
            lblPostBeløb.Visible = true;
            lblPostBeskrivelse.Visible = true;
            txtPostBeskrivelse.Visible = true;
            lblPostDato.Visible = true;
            dtpPostDato.Visible = true;
            lblPosteringer.Visible = false;
            lstPosteringer.Visible = false;
            lblPosteringsType.Visible = true;
            cboPosteringsType.Visible = true;

            btnPostGem.Visible = true;
            btnPostAnnuller.Visible = false;
            btnPostFortryd.Visible = true;
            btnPostOpret.Visible = false;
            btnVisTypePoster.Visible = false;
            btnVisRapport.Visible = false;

            txtBilagsNr.Focus();
        }

        #endregion

        #region Update-metoder

        // Metode til at opdatere listview med posteringer
        public void ListPosteringUpdate()
        {
            lstPosteringer.Items.Clear();

            IPosteringsdata ipost;
            IEnumerator ipostIterator = system.GetPosteringer();
            ipostIterator.Reset();

            while (ipostIterator.MoveNext())
            {
                ipost = (IPosteringsdata)ipostIterator.Current;

                ListViewItem line = new ListViewItem();
                line.Text = ipost.BilagsNr.ToString();
                line.SubItems.Add(ipost.PosteringsType);
                line.SubItems.Add(ipost.Beskrivelse);
                line.SubItems.Add(ipost.Beløb.ToString());
                line.SubItems.Add(ipost.Dato.ToString());
                if (ipost.Aktiv == true)
                {
                    line.SubItems.Add("Gældende");
                }
                else
                {
                    line.SubItems.Add("Annulleret");
                }
                lstPosteringer.Items.Add(line);
            }
        }

        #endregion

        #region Knapper og clicks

        // Opret-knappen
        private void btnPostOpret_Click(object sender, EventArgs e)
        {
            txtBilagsNr.Clear();
            txtPostBeløb.Clear();
            txtPostBeskrivelse.Clear();
            cboPosteringsType.SelectedItem = null;
            dtpPostDato.Value = DateTime.Now;

            OpretTilstand_Bogfør();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu oprette en postering.";
        }

        // Gem-knappen
        private void btnPostGem_Click(object sender, EventArgs e)
        {
            long bilagsNr;
            string posteringsType;
            string beskrivelse;
            double beløb;
            DateTime dato;
            bool aktiv = true;
            bool res;

            // inputvalidering af bilagsNr
            res = long.TryParse(txtBilagsNr.Text, out bilagsNr);
            if (!res)
            {
                txtBilagsNr.Clear();
                txtBilagsNr.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst bilags nr. som heltal";
                return;
            }

            // inputvalidering af posteringsType
            if (cboPosteringsType.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst posteringens type.";
                cboPosteringsType.Focus();
                return;
            }
            else
            {
                posteringsType = cboPosteringsType.SelectedItem.ToString();
            }

            // inputvalidering af beskrivelse
            beskrivelse = txtPostBeskrivelse.Text;
            if (txtPostBeskrivelse.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en beskrivelse af posteringen.";
                txtPostBeskrivelse.Focus();
                return;
            }

            // inputvalidering af beløb
            res = double.TryParse(txtPostBeløb.Text, out beløb);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et tal";
                txtPostBeløb.Clear();
                txtPostBeløb.Focus();
                return;
            }

            // inputvalidering af PostDato
            dato = dtpPostDato.Value.Date;

            // gem nyt post-objekt
            IPosteringsdata ipost;
            IEnumerator ipostIterator = system.GetPosteringer();
            ipostIterator.Reset();

            while (ipostIterator.MoveNext())
            {
                ipost = (IPosteringsdata)ipostIterator.Current;

                if (bilagsNr == ipost.BilagsNr)
                {
                    txtBilagsNr.Clear();
                    txtBilagsNr.Focus();
                    lblStatus.ForeColor = Color.Red;
                    lblStatus.Text = "Det indtastede bilags nr. eksisterer i forvejen, indtast venligst et nyt.";
                    return;
                }
            }

            res = system.OpretPostering(bilagsNr, posteringsType, beskrivelse, beløb, dato, aktiv);
            if (res == true)
            {
                ListPosteringUpdate();
                NormalTilstand_Bogfør();
                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Posteringen er nu oprettet i systemet.";
            }
            else
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Posteringen kunne ikke oprettes pga. en systemfejl.";
                NormalTilstand_Bogfør();
            }
        }

        // Annuller-knappen 
        private void btnPostAnnuller_Click(object sender, EventArgs e)
        {
            long bilagsNr = 0;
            bool aktiv = false;
            bool res;

            if (lstPosteringer.SelectedItems.Count > 0)     // Hvis der er et selected item i listviewet
            {
                int selectedIndex = lstPosteringer.SelectedIndices[0];   // Vælg første selected index

                ListViewItem line = lstPosteringer.Items[selectedIndex];

                bilagsNr = Convert.ToInt64(line.Text);
            }
            else
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst den postering, som du ønsker at annullere.";
                lstPosteringer.Focus();
                return;
            }

            DialogResult res2 = MessageBox.Show("Er du sikker på, at du vil anullere posteringen?", "Vil du annullere?", MessageBoxButtons.YesNo,
                                                  MessageBoxIcon.Warning);
            if (res2 == DialogResult.Yes)
            {
                res = system.AnnullerPostering(bilagsNr, aktiv);
                ListPosteringUpdate();
                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Posteringen er nu annulleret.";

                if (res == false)
                {
                    lblStatus.ForeColor = Color.Red;
                    lblStatus.Text = "Posteringen kunne ikke annulleres pga. en systemfejl.";
                }
            }
        }

        // Fortryd-knappen
        private void btnPostFortryd_Click(object sender, EventArgs e)
        {
            txtBilagsNr.Clear();
            txtPostBeløb.Clear();
            txtPostBeskrivelse.Clear();
            cboPosteringsType.SelectedItem = null;
            dtpPostDato.Value = DateTime.Now;
            ListPosteringUpdate();

            NormalTilstand_Bogfør();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        // Afslut-knappen
        private void btnAfslut_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        // Vis posteringer af valgt type-knappen
        private void btnVisTypePoster_Click_1(object sender, EventArgs e)
        {
            string posteringsType;

            if (cboPosteringsType.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst den type posteringer, som du ønsker at se.";
                cboPosteringsType.Focus();
                return;
            }
            else
            {
                posteringsType = cboPosteringsType.SelectedItem.ToString();
            }

            lstPosteringer.Items.Clear();

            IPosteringsdata ipost;
            IEnumerator ipostIterator = system.GetPosteringer();
            ipostIterator.Reset();

            while (ipostIterator.MoveNext())
            {
                ipost = (IPosteringsdata)ipostIterator.Current;

                if (posteringsType == ipost.PosteringsType)
                {
                    ListViewItem line = new ListViewItem();
                    line.Text = ipost.BilagsNr.ToString();
                    line.SubItems.Add(ipost.PosteringsType);
                    line.SubItems.Add(ipost.Beskrivelse);
                    line.SubItems.Add(ipost.Beløb.ToString());
                    line.SubItems.Add(ipost.Dato.ToString());
                    if (ipost.Aktiv == true)
                    {
                        line.SubItems.Add("Gældende");
                    }
                    else
                    {
                        line.SubItems.Add("Annulleret");
                    }
                    lstPosteringer.Items.Add(line);
                }
            }
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du ser nu alle posteringer af typen " + posteringsType.ToString() + ".";
        }

        // Gå til rapport knap
        private void btnVisRapport_Click(object sender, EventArgs e)
        {
            FrmPostRap frmPostRap = new FrmPostRap(system);
            this.Hide();
            frmPostRap.ShowDialog();
            this.Show();
        }

        #endregion

        #endregion

        /************************ Region "Opstil årsregnskab" ************************/
        #region "Opstil Årsregnskab"

        #region Tilstandsstyring

        // normal tilstand
        private void NormalTilstand_Årsregnskab()
        {
            cboÅrstal.Enabled = false;
            txtImmaterielle.ReadOnly = true;
            txtMaterielle.ReadOnly = true;
            txtFinansielle.ReadOnly = true;
            txtVarebeholdninger.ReadOnly = true;
            txtTilgodehavener.ReadOnly = true;
            txtVærdipapirer.ReadOnly = true;
            txtLikvideBeholdninger.ReadOnly = true;
            txtAktiekapital.ReadOnly = true;
            txtOverførteIndskud.ReadOnly = true;
            txtForslagTilUdbytte.ReadOnly = true;
            txtHensatteForpligtelser.ReadOnly = true;
            txtLangfristetGæld.ReadOnly = true;
            txtKortfristetGæld.ReadOnly = true;

            btnÅrsOpstilÅrsRengskab.Visible = true;
            btnÅrsFortryd.Visible = false;
            btnÅrsRediger.Visible = true;
            btnÅrsOpstil.Visible = false;
            btnÅrsSammenlign.Enabled = true;
            btnÅrsVis.Visible = false;
            btnArsFortryd2.Visible = false;
            cboFørsteÅr.Enabled = false;
            cboAndetÅr.Enabled = false;
            cboTredjeÅr.Enabled = false;
            cboNøgletalsAnalyser.Enabled = false;
        }

        // opstil tilstand
        private void OpstilTilstand_Årsregnskab()
        {
            cboÅrstal.Enabled = true;
            txtImmaterielle.ReadOnly = false;
            txtMaterielle.ReadOnly = false;
            txtFinansielle.ReadOnly = false;
            txtVarebeholdninger.ReadOnly = false;
            txtTilgodehavener.ReadOnly = false;
            txtVærdipapirer.ReadOnly = false;
            txtLikvideBeholdninger.ReadOnly = false;
            txtAktiekapital.ReadOnly = false;
            txtOverførteIndskud.ReadOnly = false;
            txtForslagTilUdbytte.ReadOnly = false;
            txtHensatteForpligtelser.ReadOnly = false;
            txtLangfristetGæld.ReadOnly = false;
            txtKortfristetGæld.ReadOnly = false;

            btnÅrsOpstilÅrsRengskab.Visible = false;
            btnÅrsFortryd.Visible = true;
            btnÅrsRediger.Visible = false;
            btnÅrsOpstil.Visible = true;
            btnÅrsSammenlign.Enabled = true;
            btnÅrsVis.Enabled = true;
            btnArsFortryd2.Visible = false;
            cboFørsteÅr.Enabled = false;
            cboAndetÅr.Enabled = false;
            cboTredjeÅr.Enabled = false;
            cboNøgletalsAnalyser.Enabled = false;
        }

        // sammenlign tilstand
        private void SammenlignTilstand_Årsregnskab()
        {
            cboÅrstal.Enabled = false;
            txtImmaterielle.ReadOnly = true;
            txtMaterielle.ReadOnly = true;
            txtFinansielle.ReadOnly = true;
            txtVarebeholdninger.ReadOnly = true;
            txtTilgodehavener.ReadOnly = true;
            txtVærdipapirer.ReadOnly = true;
            txtLikvideBeholdninger.ReadOnly = true;
            txtAktiekapital.ReadOnly = true;
            txtOverførteIndskud.ReadOnly = true;
            txtForslagTilUdbytte.ReadOnly = true;
            txtHensatteForpligtelser.ReadOnly = true;
            txtLangfristetGæld.ReadOnly = true;
            txtKortfristetGæld.ReadOnly = true;

            btnÅrsOpstilÅrsRengskab.Visible = false;
            btnÅrsFortryd.Visible = false;
            btnÅrsRediger.Visible = false;
            btnÅrsOpstil.Visible = false;
            btnÅrsSammenlign.Enabled = false;
            btnÅrsVis.Visible = true;
            btnArsFortryd2.Visible = true;
            cboFørsteÅr.Enabled = true;
            cboAndetÅr.Enabled = true;
            cboTredjeÅr.Enabled = true;
            cboNøgletalsAnalyser.Enabled = true;
        }

        #endregion

        #region Update-metode

        // hjælpemetode til at opdatere comboboks
        private void CboÅrUpdate()
        {
            cboÅrstal.Items.Clear();
            cboFørsteÅr.Items.Clear();
            cboAndetÅr.Items.Clear();
            cboTredjeÅr.Items.Clear();

            IÅrsregnskabsdata iÅrsdata;
            IEnumerator iÅrsIterator = system.GetÅrsregnskaber();
            iÅrsIterator.Reset();

            while (iÅrsIterator.MoveNext())
            {
                iÅrsdata = (IÅrsregnskabsdata)iÅrsIterator.Current;

                cboÅrstal.Items.Add(iÅrsdata.Årstal.ToString());
                cboFørsteÅr.Items.Add(iÅrsdata.Årstal.ToString());
                cboAndetÅr.Items.Add(iÅrsdata.Årstal.ToString());
                cboTredjeÅr.Items.Add(iÅrsdata.Årstal.ToString());
            }
        }

        #endregion

        #region Knapper og clicks

        // opstil årsregnskab knappen
        private void btnÅrsOpstilÅrsRengskab_Click(object sender, EventArgs e)
        {
            CboÅrUpdate();
            cboÅrstal.SelectedItem = null;
            cboFørsteÅr.SelectedItem = null;
            cboAndetÅr.SelectedItem = null;
            cboTredjeÅr.SelectedItem = null;
            cboNøgletalsAnalyser.SelectedItem = null;
            lstSammenligning.Items.Clear();

            txtImmaterielle.Clear();
            txtMaterielle.Clear();
            txtFinansielle.Clear();
            txtVarebeholdninger.Clear();
            txtTilgodehavener.Clear();
            txtVærdipapirer.Clear();
            txtLikvideBeholdninger.Clear();
            txtAktiekapital.Clear();
            txtOverførteIndskud.Clear();
            txtForslagTilUdbytte.Clear();
            txtHensatteForpligtelser.Clear();
            txtLangfristetGæld.Clear();
            txtKortfristetGæld.Clear();

            OpstilTilstand_Årsregnskab();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu opstille et årsregnskab.";
        }

        // rediger knappen
        private void btnÅrsRediger_Click(object sender, EventArgs e)
        {
            CboÅrUpdate();
            OpstilTilstand_Årsregnskab();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu redigere et årsregnskab.";
        }

        // fortryd knappen
        private void btnÅrsFortryd_Click(object sender, EventArgs e)
        {
            cboÅrstal.SelectedItem = null;
            cboFørsteÅr.SelectedItem = null;
            cboAndetÅr.SelectedItem = null;
            cboTredjeÅr.SelectedItem = null;
            cboNøgletalsAnalyser.SelectedItem = null;
            lstSammenligning.Items.Clear();

            txtImmaterielle.Clear();
            txtMaterielle.Clear();
            txtFinansielle.Clear();
            txtVarebeholdninger.Clear();
            txtTilgodehavener.Clear();
            txtVærdipapirer.Clear();
            txtLikvideBeholdninger.Clear();
            txtAktiekapital.Clear();
            txtOverførteIndskud.Clear();
            txtForslagTilUdbytte.Clear();
            txtHensatteForpligtelser.Clear();
            txtLangfristetGæld.Clear();
            txtKortfristetGæld.Clear();

            NormalTilstand_Årsregnskab();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        // Opstil knappen
        private void btnÅrsOpstil_Click(object sender, EventArgs e)
        {
            int årstal;
            double immaterielle, materielle, finansielle, varebeholdninger, tilgodehavender, værdipapirer, likvideBeholdninger,
                   aktiekapital, overførteOverskud, forslagTilUdbytte, hensatteForpligtelser, langfristetGæld, kortfristetGæld;
            bool res;

            #region Inputvalidering

            // inputvalidering af årstal
            if (cboÅrstal.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst et årstal.";
                cboÅrstal.Focus();
                return;
            }
            else
            {
                årstal = Convert.ToInt32(cboÅrstal.SelectedItem);
            }

            // inputvalidering af tekstbokse
            res = double.TryParse(txtImmaterielle.Text, out immaterielle);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtImmaterielle.Clear();
                txtImmaterielle.Focus();
                return;
            }

            res = double.TryParse(txtMaterielle.Text, out materielle);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtMaterielle.Clear();
                txtMaterielle.Focus();
                return;
            }

            res = double.TryParse(txtFinansielle.Text, out finansielle);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtFinansielle.Clear();
                txtFinansielle.Focus();
                return;
            }

            res = double.TryParse(txtVarebeholdninger.Text, out varebeholdninger);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtVarebeholdninger.Clear();
                txtVarebeholdninger.Focus();
                return;
            }

            res = double.TryParse(txtTilgodehavener.Text, out tilgodehavender);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtTilgodehavener.Clear();
                txtTilgodehavener.Focus();
                return;
            }

            res = double.TryParse(txtVærdipapirer.Text, out værdipapirer);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtVærdipapirer.Clear();
                txtVærdipapirer.Focus();
                return;
            }

            res = double.TryParse(txtLikvideBeholdninger.Text, out likvideBeholdninger);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtLikvideBeholdninger.Clear();
                txtLikvideBeholdninger.Focus();
                return;
            }

            res = double.TryParse(txtAktiekapital.Text, out aktiekapital);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtAktiekapital.Clear();
                txtAktiekapital.Focus();
                return;
            }

            res = double.TryParse(txtOverførteIndskud.Text, out overførteOverskud);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtOverførteIndskud.Clear();
                txtOverførteIndskud.Focus();
                return;
            }

            res = double.TryParse(txtForslagTilUdbytte.Text, out forslagTilUdbytte);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtForslagTilUdbytte.Clear();
                txtForslagTilUdbytte.Focus();
                return;
            }

            res = double.TryParse(txtHensatteForpligtelser.Text, out hensatteForpligtelser);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtHensatteForpligtelser.Clear();
                txtHensatteForpligtelser.Focus();
                return;
            }

            res = double.TryParse(txtLangfristetGæld.Text, out langfristetGæld);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtLangfristetGæld.Clear();
                txtLangfristetGæld.Focus();
                return;
            }

            res = double.TryParse(txtKortfristetGæld.Text, out kortfristetGæld);
            if (!res)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst beløbet som et decimaltal.";
                txtKortfristetGæld.Clear();
                txtKortfristetGæld.Focus();
                return;
            }

            #endregion

            // Opstil årsregnskab
            res = system.OpstilÅrsregnskab(årstal, immaterielle, materielle, finansielle, varebeholdninger, tilgodehavender,
                værdipapirer, likvideBeholdninger, aktiekapital, overførteOverskud, forslagTilUdbytte,
                hensatteForpligtelser, langfristetGæld, kortfristetGæld);
            if (res == true)
            {
                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Det opstillede årsregnskab kan nu ses i rapporten.";
            }
            else
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Årsregnskabet kunne ikke opstilles pga. en systemfejl.";
            }
        }

        // sammenlign nøgletal-knappen
        private void btnÅrsSammenlign_Click(object sender, EventArgs e)
        {
            CboÅrUpdate();
            SammenlignTilstand_Årsregnskab();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu vælge hvilke tre års nøgletal, som du ønsker at sammenligne, samt hvilken analysen du ønsker at se.";
        }

        // vis sammenligning af nøgletal-knappen
        private void btnÅrsVis_Click(object sender, EventArgs e)
        {
            int førsteÅr, andetÅr, tredjeÅr;
            List<int> årliste = new List<int>();
            string analyse;
            double afkastningsgrad, overskudsgrad, omsætningshastighed, egenkapital, fremmedkapital, dækningsgrad, omsætning, produktion, distribution, administration,
                nulpunktsomsætning, sikkerhedsmargin, kapacitetsgrad, aktivernes, anlægsaktivers, materielle, varelagrenes, lagerdage, varedebitorernes, kreditdage,
                soliditetsgrad, likviditetsgrad1, likviditetsgrad2;

            // inputvalidering af combobokse
            if (cboFørsteÅr.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst det første år.";
                cboFørsteÅr.Focus();
                return;
            }
            else
            {
                førsteÅr = Convert.ToInt32(cboFørsteÅr.SelectedItem);
                årliste.Add(førsteÅr);
            }

            if (cboAndetÅr.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst det andet år.";
                cboAndetÅr.Focus();
                return;
            }
            else
            {
                andetÅr = Convert.ToInt32(cboAndetÅr.SelectedItem);
                årliste.Add(andetÅr);
            }

            if (cboTredjeÅr.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst det tredje år.";
                cboTredjeÅr.Focus();
                return;
            }
            else
            {
                tredjeÅr = Convert.ToInt32(cboTredjeÅr.SelectedItem);
                årliste.Add(tredjeÅr);
            }

            if (cboNøgletalsAnalyser.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst den analyse, hvis nøgletal du ønsker at sammenligne.";
                cboNøgletalsAnalyser.Focus();
                return;
            }
            else
            {
                analyse = cboNøgletalsAnalyser.SelectedItem.ToString();
            }

            // udskriv de forskellige analyser
            #region Rentabilitetsanalyse

            if (analyse == "Rentabilitetsanalyse")
            {
                col2.Text = "Afkastningsgrad (%):";
                col2.Width = 140;
                col3.Text = "Overskudsgrad (%):";
                col3.Width = 140;
                col4.Text = "Aktivernes omsætningshastighed (gange):";
                col4.Width = 220;
                col5.Text = "Egenkapitalens forretning (%):";
                col5.Width = 175;
                col6.Text = "Fremmedkapitalens forretning (%):";
                col6.Width = 185;
                col7.Text = "";
                col7.Width = 0;
                col8.Text = "";
                col8.Width = 0;
                col9.Text = "";
                col9.Width = 0;
                col10.Text = "";
                col10.Width = 0;

                lstSammenligning.Items.Clear();
                ListViewItem line;

                foreach (int år in årliste)
                {
                    line = new ListViewItem();

                    afkastningsgrad = system.GetAfkastningsgrad(år);
                    overskudsgrad = system.GetOverskudsgrad(år);
                    omsætningshastighed = system.GetAktivernesOmsætningshastighed(år);
                    egenkapital = system.GetEgenkapitalensForretning(år);
                    fremmedkapital = system.GetFremmedkapitalensForretning(år);

                    line.Text = år.ToString();
                    line.SubItems.Add(afkastningsgrad.ToString("F2"));
                    line.SubItems.Add(overskudsgrad.ToString("F2"));
                    line.SubItems.Add(omsætningshastighed.ToString("F2"));
                    line.SubItems.Add(egenkapital.ToString("F2"));
                    line.SubItems.Add(fremmedkapital.ToString("F2"));
                    lstSammenligning.Items.Add(line);
                }

                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Du kan nu se hver af de tre års rentabilitetsanalyse.";
            }

            #endregion

            #region Analyse af indtjeningsevnen

            else if (analyse == "Analyse af indtjeningsevnen")
            {
                col2.Text = "Overskudsgrad (%):";
                col2.Width = 140;
                col3.Text = "Dækningsgrad (%):";
                col3.Width = 140;
                col4.Text = "Omsætning (indeks):";
                col4.Width = 140;
                col5.Text = "Produktionsomkostninger (indeks):";
                col5.Width = 200;
                col6.Text = "Distributionsomkostninger (indeks):";
                col6.Width = 200;
                col7.Text = "Administrationsomkostninger (indeks):";
                col7.Width = 200;
                col8.Text = "Nulpunktsomsætning (dkr.):";
                col8.Width = 160;
                col9.Text = "Sikkerhedsmargin (%):";
                col9.Width = 140;
                col10.Text = "Kapacitetsgrad:";
                col10.Width = 140;

                lstSammenligning.Items.Clear();
                ListViewItem line = new ListViewItem();

                // første år
                overskudsgrad = system.GetOverskudsgrad(førsteÅr);
                dækningsgrad = system.GetDækningsgrad(førsteÅr);
                omsætning = system.SætÅrSomIndeks();
                produktion = system.SætÅrSomIndeks();
                distribution = system.SætÅrSomIndeks();
                administration = system.SætÅrSomIndeks();
                nulpunktsomsætning = system.GetNulpunktsomsætning(førsteÅr);
                sikkerhedsmargin = system.GetSikkerhedsMargin(førsteÅr);
                kapacitetsgrad = system.GetKapacitetsgrad(førsteÅr);

                line.Text = førsteÅr.ToString();
                line.SubItems.Add(overskudsgrad.ToString("F2"));
                line.SubItems.Add(dækningsgrad.ToString("F2"));
                line.SubItems.Add(omsætning.ToString("F2"));
                line.SubItems.Add(produktion.ToString("F2"));
                line.SubItems.Add(distribution.ToString("F2"));
                line.SubItems.Add(administration.ToString("F2"));
                line.SubItems.Add(nulpunktsomsætning.ToString("F2"));
                line.SubItems.Add(sikkerhedsmargin.ToString("F2"));
                line.SubItems.Add(kapacitetsgrad.ToString("F2"));
                lstSammenligning.Items.Add(line);

                // andet år
                line = new ListViewItem();
                overskudsgrad = system.GetOverskudsgrad(andetÅr);
                dækningsgrad = system.GetDækningsgrad(andetÅr);
                omsætning = system.GetIndekstalOmsætning(andetÅr, førsteÅr);
                produktion = system.GetIndekstalProduktionsomkostninger(andetÅr, førsteÅr);
                distribution = system.GetIndekstalDistributionsomkostninger(andetÅr, førsteÅr);
                administration = system.GetIndekstalAdministrationsomkostninger(andetÅr, førsteÅr);
                nulpunktsomsætning = system.GetNulpunktsomsætning(andetÅr);
                sikkerhedsmargin = system.GetSikkerhedsMargin(andetÅr);
                kapacitetsgrad = system.GetKapacitetsgrad(andetÅr);

                line.Text = andetÅr.ToString();
                line.SubItems.Add(overskudsgrad.ToString("F2"));
                line.SubItems.Add(dækningsgrad.ToString());
                line.SubItems.Add(omsætning.ToString("F2"));
                line.SubItems.Add(produktion.ToString("F2"));
                line.SubItems.Add(distribution.ToString("F2"));
                line.SubItems.Add(administration.ToString("F2"));
                line.SubItems.Add(nulpunktsomsætning.ToString("F2"));
                line.SubItems.Add(sikkerhedsmargin.ToString("F2"));
                line.SubItems.Add(kapacitetsgrad.ToString("F2"));
                lstSammenligning.Items.Add(line);

                // trejde år
                line = new ListViewItem();
                overskudsgrad = system.GetOverskudsgrad(tredjeÅr);
                dækningsgrad = system.GetDækningsgrad(tredjeÅr);
                omsætning = system.GetIndekstalOmsætning(tredjeÅr, førsteÅr);
                produktion = system.GetIndekstalProduktionsomkostninger(tredjeÅr, førsteÅr);
                distribution = system.GetIndekstalDistributionsomkostninger(tredjeÅr, førsteÅr);
                administration = system.GetIndekstalAdministrationsomkostninger(tredjeÅr, førsteÅr);
                nulpunktsomsætning = system.GetNulpunktsomsætning(tredjeÅr);
                sikkerhedsmargin = system.GetSikkerhedsMargin(tredjeÅr);
                kapacitetsgrad = system.GetKapacitetsgrad(tredjeÅr);

                line.Text = tredjeÅr.ToString();
                line.SubItems.Add(overskudsgrad.ToString("F2"));
                line.SubItems.Add(dækningsgrad.ToString("F2"));
                line.SubItems.Add(omsætning.ToString("F2"));
                line.SubItems.Add(produktion.ToString("F2"));
                line.SubItems.Add(distribution.ToString("F2"));
                line.SubItems.Add(administration.ToString("F2"));
                line.SubItems.Add(nulpunktsomsætning.ToString("F2"));
                line.SubItems.Add(sikkerhedsmargin.ToString("F2"));
                line.SubItems.Add(kapacitetsgrad.ToString("F2"));
                lstSammenligning.Items.Add(line);

                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Du kan nu se hver af de tre års analyse af indtjeningsevnen.";
            }

            #endregion

            #region Analyse af kapitaltilpasningen

            else if (analyse == "Analyse af kapitaltilpasningen")
            {
                col2.Text = "Aktivernes omsætningshastighed (gange):";
                col2.Width = 220;
                col3.Text = "Anlægsaktivers omsætningshastighed (gange):";
                col3.Width = 230;
                col4.Text = "Materielle anlægsaktivers omsætningshastighed (gange):";
                col4.Width = 250;
                col5.Text = "Varelagrenes omsætningshastighed (gange):";
                col5.Width = 230;
                col6.Text = "Lagerdage (antal):";
                col6.Width = 140;
                col7.Text = "Varedebitorernes omsætningshastighed (gange):";
                col7.Width = 230;
                col8.Text = "Kreditdage (antal):";
                col8.Width = 140;
                col9.Text = "";
                col9.Width = 0;
                col10.Text = "";
                col10.Width = 0;

                lstSammenligning.Items.Clear();
                ListViewItem line;

                foreach (int år in årliste)
                {
                    line = new ListViewItem();

                    aktivernes = system.GetAktivernesOmsætningshastighed(år);
                    anlægsaktivers = system.GetAnlægsaktivernesOmsætningshastighed(år);
                    materielle = system.GetMaterielleOmsætningshastighed(år);
                    varelagrenes = system.GetVarelagrenesOmsætningshastighed(år);
                    lagerdage = system.GetLagerdage(år);
                    varedebitorernes = system.GetVaredebitorernesOmsætningshastighed(år);
                    kreditdage = system.GetKreditdage(år);

                    line.Text = år.ToString();
                    line.SubItems.Add(aktivernes.ToString("F2"));
                    line.SubItems.Add(anlægsaktivers.ToString("F2"));
                    line.SubItems.Add(materielle.ToString("F2"));
                    line.SubItems.Add(varelagrenes.ToString("F2"));
                    line.SubItems.Add(lagerdage.ToString("F2"));
                    line.SubItems.Add(varedebitorernes.ToString("F2"));
                    line.SubItems.Add(kreditdage.ToString("F2"));
                    lstSammenligning.Items.Add(line);
                }

                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Du kan nu se hver af de tre års analyse af kapitaltilpasningen.";
            }

            #endregion

            #region Analyse af soliditet og likviditet

            else    // analyse == "Analyse af soliditet og likviditet" 
            {
                col2.Text = "Soliditetsgrad (%):";
                col2.Width = 140;
                col3.Text = "Likviditetsgrad I:";
                col3.Width = 140;
                col4.Text = "Likviditetsgrad II:";
                col4.Width = 140;
                col5.Text = "";
                col5.Width = 0;
                col6.Text = "";
                col6.Width = 0;
                col7.Text = "";
                col7.Width = 0;
                col8.Text = "";
                col8.Width = 0;
                col9.Text = "";
                col9.Width = 0;
                col10.Text = "";
                col10.Width = 0;

                lstSammenligning.Items.Clear();
                ListViewItem line;

                foreach (int år in årliste)
                {
                    line = new ListViewItem();

                    soliditetsgrad = system.GetSoliditetsgrad(år);
                    likviditetsgrad1 = system.GetLikviditetsgrad1(år);
                    likviditetsgrad2 = system.GetLikviditetsgrad2(år);

                    line.Text = år.ToString();
                    line.SubItems.Add(soliditetsgrad.ToString("F2"));
                    line.SubItems.Add(likviditetsgrad1.ToString("F2"));
                    line.SubItems.Add(likviditetsgrad2.ToString("F2"));
                    lstSammenligning.Items.Add(line);
                }

                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Du kan nu se hver af de tre års analyse af soliditet og likviditet.";
            }

            #endregion
        }

        // vis rapport-knappen
        private void btnÅrVis_Click(object sender, EventArgs e)
        {
            int årstal;

            if (cboÅrstal.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst det årstal som du ønsker at se regnskabet for.";
                CboÅrUpdate();
                cboÅrstal.Focus();
                return;
            }
            else
            {
                årstal = Convert.ToInt32(cboÅrstal.SelectedItem);
            }

            FrmÅrRap frmÅrRap = new FrmÅrRap(system, årstal);
            this.Hide();
            frmÅrRap.ShowDialog();
            this.Show();
        }

        // fortryd 2-knappen
        private void btnArsFortryd2_Click(object sender, EventArgs e)
        {
            cboFørsteÅr.SelectedItem = null;
            cboAndetÅr.SelectedItem = null;
            cboTredjeÅr.SelectedItem = null;
            cboNøgletalsAnalyser.SelectedItem = null;

            NormalTilstand_Årsregnskab();
        }

        // når der vælges et årstal
        private void cboÅrstal_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboÅrstal.SelectedItem != null)
            {
                int årstal = Convert.ToInt32(cboÅrstal.SelectedItem.ToString());

                IÅrsregnskabsdata iÅr;
                IEnumerator iÅrIterator = system.GetÅrsregnskaber();
                iÅrIterator.Reset();

                while (iÅrIterator.MoveNext())
                {
                    iÅr = (IÅrsregnskabsdata)iÅrIterator.Current;

                    if (iÅr.Årstal == årstal)
                    {
                        txtImmaterielle.Text = iÅr.Immaterielle.ToString();
                        txtMaterielle.Text = iÅr.Materielle.ToString();
                        txtFinansielle.Text = iÅr.Finansielle.ToString();
                        txtVarebeholdninger.Text = iÅr.Varebeholdninger.ToString();
                        txtTilgodehavener.Text = iÅr.Tilgodehavender.ToString();
                        txtVærdipapirer.Text = iÅr.Værdipapirer.ToString();
                        txtLikvideBeholdninger.Text = iÅr.LikvideBeholdninger.ToString();
                        txtAktiekapital.Text = iÅr.Aktiekapital.ToString();
                        txtOverførteIndskud.Text = iÅr.OverførteOverskud.ToString();
                        txtForslagTilUdbytte.Text = iÅr.ForslagTilUdbytte.ToString();
                        txtHensatteForpligtelser.Text = iÅr.HensatteForpligtelser.ToString();
                        txtLangfristetGæld.Text = iÅr.LangfristetGæld.ToString();
                        txtKortfristetGæld.Text = iÅr.KortfristetGæld.ToString();
                    }
                }
            }
        }

        #endregion

        #endregion

        /************************ Region "Håndter medarbejder" ************************/
        #region "Håndter medarbejder"

        #region Tilstandsstyring

        // normal tilstand
        private void NormalTilstand_Medarbejder()
        {
            tilstandMedarbejder = NORMAL_TILSTAND;

            txtMedarbNr_Medarb.ReadOnly = true;
            txtNavn_Medarb.ReadOnly = true;
            txtEmail_Medarb.ReadOnly = true;
            txtTlfNr_Medarb.ReadOnly = true;
            txtAdresse_Medarb.ReadOnly = true;
            cboAktiv_Medarb.Enabled = false;
            txtPostnr_Medarb.ReadOnly = true;
            txtBynavn_Medarb.ReadOnly = true;
            lstMedarbejdere_Medarb.Enabled = true;

            btnMedarbOpret.Visible = true;
            btnMedarbRediger.Visible = false;
            btnMedarbFortryd.Visible = false;
            btnMedarbGem.Visible = false;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        // opret tilstand
        private void OpretTilstand_Medarbejder()
        {
            tilstandMedarbejder = OPRET_TILSTAND;

            txtMedarbNr_Medarb.ReadOnly = true;
            txtNavn_Medarb.ReadOnly = false;
            txtEmail_Medarb.ReadOnly = false;
            txtTlfNr_Medarb.ReadOnly = false;
            txtAdresse_Medarb.ReadOnly = false;
            cboAktiv_Medarb.Enabled = true;
            txtPostnr_Medarb.ReadOnly = false;
            txtBynavn_Medarb.ReadOnly = true;

            lstMedarbejdere_Medarb.Enabled = false;

            btnMedarbOpret.Visible = false;
            btnMedarbRediger.Visible = false;
            btnMedarbFortryd.Visible = true;
            btnMedarbGem.Visible = true;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu oprette en medarbejder.";

            txtNavn_Medarb.Focus();
        }

        // rediger tilstand
        private void RedigerTilstand_Medarbejder()
        {
            tilstandMedarbejder = REDIGER_TILSTAND;

            txtMedarbNr_Medarb.ReadOnly = true;
            txtNavn_Medarb.ReadOnly = false;
            txtEmail_Medarb.ReadOnly = false;
            txtTlfNr_Medarb.ReadOnly = false;
            txtAdresse_Medarb.ReadOnly = false;
            cboAktiv_Medarb.Enabled = true;
            txtPostnr_Medarb.ReadOnly = false;
            txtBynavn_Medarb.ReadOnly = true;

            lstMedarbejdere_Medarb.Enabled = false;

            btnMedarbOpret.Visible = false;
            btnMedarbRediger.Visible = false;
            btnMedarbFortryd.Visible = true;
            btnMedarbGem.Visible = true;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu redigere medarbejderen.";

            txtNavn_Medarb.Focus();
        }

        #endregion

        #region Update-metoder

        // hjælpemetode til at opdatere listview
        public void ListMedarbUpdate()
        {
            lstMedarbejdere_Medarb.Items.Clear();

            IMedarbejderdata iMedarbejder;
            IEnumerator iMedarbIterator = system.GetMedarbejdere();
            iMedarbIterator.Reset();

            while (iMedarbIterator.MoveNext())
            {
                iMedarbejder = (IMedarbejderdata)iMedarbIterator.Current;

                ListViewItem line = new ListViewItem();

                line.Text = iMedarbejder.MedarbNr.ToString();
                line.SubItems.Add(iMedarbejder.Navn);
                line.SubItems.Add(iMedarbejder.Email);
                line.SubItems.Add(iMedarbejder.TlfNr.ToString());
                line.SubItems.Add(iMedarbejder.Adresse);
                line.SubItems.Add(iMedarbejder.Postnr.ToString());
                line.SubItems.Add(iMedarbejder.Bynavn);
                if (iMedarbejder.Aktiv == true)
                {
                    line.SubItems.Add("Ja");
                }
                else
                {
                    line.SubItems.Add("Nej");
                }

                lstMedarbejdere_Medarb.Items.Add(line);
            }
        }

        #endregion

        #region Knapper og clicks

        // Opret-knappen
        private void btnMedarbOpret_Click_1(object sender, EventArgs e)
        {
            txtMedarbNr_Medarb.Clear();
            txtNavn_Medarb.Clear();
            txtEmail_Medarb.Clear();
            txtTlfNr_Medarb.Clear();
            txtAdresse_Medarb.Clear();
            txtPostnr_Medarb.Clear();
            txtBynavn_Medarb.Clear();
            cboAktiv_Medarb.SelectedItem = null;

            OpretTilstand_Medarbejder();
        }

        // Rediger-knappen
        private void btnMedarbRediger_Click(object sender, EventArgs e)
        {
            RedigerTilstand_Medarbejder();
        }

        // Fortryd-knappen
        private void btnMedarbFortryd_Click(object sender, EventArgs e)
        {
            txtMedarbNr_Medarb.Clear();
            txtNavn_Medarb.Clear();
            txtEmail_Medarb.Clear();
            txtTlfNr_Medarb.Clear();
            txtAdresse_Medarb.Clear();
            txtPostnr_Medarb.Clear();
            txtBynavn_Medarb.Clear();
            cboAktiv_Medarb.SelectedItem = null;

            NormalTilstand_Medarbejder();
        }

        // Gem-knappen
        private void btnMedarbGem_Click(object sender, EventArgs e)
        {
            int medarbNr, tlfNr, postnr;
            string navn, email, adresse, bynavn;
            bool aktiv, res;

            // inputvalidering af navn
            navn = txtNavn_Medarb.Text;
            if (txtNavn_Medarb.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst et navn.";
                txtNavn_Medarb.Focus();
                return;
            }

            // inputvalidering af email
            email = txtEmail_Medarb.Text;
            if (txtEmail_Medarb.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en e-mail adresse.";
                txtEmail_Medarb.Focus();
                return;
            }

            // inputvalidering af tlfNr
            res = int.TryParse(txtTlfNr_Medarb.Text, out tlfNr);
            if (!res)
            {
                txtTlfNr_Medarb.Clear();
                txtTlfNr_Medarb.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst telefon nr. som heltal";
                return;
            }

            // inputvalidering af adresse
            adresse = txtAdresse_Medarb.Text;
            if (txtAdresse_Medarb.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en adresse.";
                txtAdresse_Medarb.Focus();
                return;
            }

            // inputvalidering af postnr
            res = int.TryParse(txtPostnr_Medarb.Text, out postnr);
            if (!res)
            {
                txtPostnr_Medarb.Clear();
                txtPostnr_Medarb.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst postnr som heltal";
                return;
            }

            // inputvalidering af aktiv
            if (cboAktiv_Medarb.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst medarbejderens ansættelses status.";
                cboAktiv_Medarb.Focus();
                return;
            }
            else if (cboAktiv_Medarb.SelectedItem.ToString() == "Ja")
            {
                aktiv = true;
            }
            else
            {
                aktiv = false;
            }

            // gem nyt medarbejder-objekt
            if (tilstandMedarbejder == OPRET_TILSTAND)
            {
                res = system.OpretMedarbejder(navn, email, tlfNr, adresse, postnr, aktiv, out medarbNr, out bynavn);
                if (res == true)
                {
                    txtMedarbNr_Medarb.Text = medarbNr.ToString();
                    txtBynavn_Medarb.Text = bynavn;
                    ListMedarbUpdate();
                }
                else
                {
                    MessageBox.Show("Medarbejderen kunne ikke oprettes pga. en systemfejl. Dette skyldes muligvis, at du har indtastet et ikke eksisterende postnr.");
                }
            }

            // gem redigeret medarbejder-objekt
            else  // tilstand = redigertilstand
            {
                medarbNr = Convert.ToInt32(txtMedarbNr_Medarb.Text);

                res = system.RedigerMedarbejder(medarbNr, navn, email, tlfNr, adresse, postnr, aktiv, out bynavn);
                if (res == false)
                {
                    MessageBox.Show("Medarbejderen kunne ikke redigeres pga. en systemfejl.Dette skyldes muligvis, at du har indtastet et ikke eksisterende postnr.");
                }
                else
                {
                    txtMedarbNr_Medarb.Text = medarbNr.ToString();
                    txtBynavn_Medarb.Text = bynavn;
                    ListMedarbUpdate();
                }
            }

            NormalTilstand_Medarbejder();
        }

        // Index changed på Medarbejder listview
        private void lstMedarbejdere_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstMedarbejdere_Medarb.SelectedItems.Count > 0)     // workaround
            {
                int selectedIndex = lstMedarbejdere_Medarb.SelectedIndices[0];   // Vælg første selected index

                ListViewItem line = lstMedarbejdere_Medarb.Items[selectedIndex];

                txtMedarbNr_Medarb.Text = line.Text;
                txtNavn_Medarb.Text = line.SubItems[1].Text;
                txtEmail_Medarb.Text = line.SubItems[2].Text;
                txtTlfNr_Medarb.Text = line.SubItems[3].Text;
                txtAdresse_Medarb.Text = line.SubItems[4].Text;
                txtPostnr_Medarb.Text = line.SubItems[5].Text;
                txtBynavn_Medarb.Text = line.SubItems[6].Text;
                if (line.SubItems[7].Text == "Ja")
                {
                    cboAktiv_Medarb.SelectedItem = cboAktiv_Medarb.Items[0];
                }
                else
                {
                    cboAktiv_Medarb.SelectedItem = cboAktiv_Medarb.Items[1];
                }
            }

            btnMedarbRediger.Visible = true;
        }

        #endregion

        #endregion

        /************************ Region "Håndter kunder" ************************/
        #region "Håndter kunder"

        #region Tilstandsstyring

        // normal tilstand
        private void NormalTilstand_Kunde()
        {
            tilstandKunde = NORMAL_TILSTAND;

            txtKundeNr_Kunde.ReadOnly = true;
            txtCvrNr_Kunde.ReadOnly = true;
            txtFirmanavn_Kunde.ReadOnly = true;
            txtKontaktperson_Kunde.ReadOnly = true;
            txtEmail_Kunde.ReadOnly = true;
            txtTlfNr_Kunde.ReadOnly = true;
            txtAdresse_Kunde.ReadOnly = true;
            txtPostnr_Kunde.ReadOnly = true;
            txtBynavn_Kunde.ReadOnly = true;

            lstKunder_Kunde.Enabled = true;

            btnOpret_Kunde.Visible = true;
            btnRediger_Kunde.Visible = false;
            btnGem_Kunde.Visible = false;
            btnFortryd_Kunde.Visible = false;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        // opret tilstand
        private void OpretTilstand_Kunde()
        {
            tilstandKunde = OPRET_TILSTAND;

            txtKundeNr_Kunde.ReadOnly = true;
            txtCvrNr_Kunde.ReadOnly = false;
            txtFirmanavn_Kunde.ReadOnly = false;
            txtKontaktperson_Kunde.ReadOnly = false;
            txtEmail_Kunde.ReadOnly = false;
            txtTlfNr_Kunde.ReadOnly = false;
            txtAdresse_Kunde.ReadOnly = false;
            txtPostnr_Kunde.ReadOnly = false;
            txtBynavn_Kunde.ReadOnly = true;

            lstKunder_Kunde.Enabled = false;

            btnOpret_Kunde.Visible = false;
            btnRediger_Kunde.Visible = false;
            btnGem_Kunde.Visible = true;
            btnFortryd_Kunde.Visible = true;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu oprette en kunde.";

            txtCvrNr_Kunde.Focus();
        }

        // rediger tilstand
        private void RedigerTilstand_Kunde()
        {
            tilstandKunde = REDIGER_TILSTAND;

            txtKundeNr_Kunde.ReadOnly = false;
            txtCvrNr_Kunde.ReadOnly = false;
            txtFirmanavn_Kunde.ReadOnly = false;
            txtKontaktperson_Kunde.ReadOnly = false;
            txtEmail_Kunde.ReadOnly = false;
            txtTlfNr_Kunde.ReadOnly = false;
            lblAdresse_Kunde.Visible = true;
            txtAdresse_Kunde.ReadOnly = false;
            txtPostnr_Kunde.ReadOnly = false;
            txtBynavn_Kunde.ReadOnly = true;

            lstKunder_Kunde.Enabled = false;

            btnOpret_Kunde.Visible = false;
            btnRediger_Kunde.Visible = false;
            btnGem_Kunde.Visible = true;
            btnFortryd_Kunde.Visible = true;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu redigere kunden.";

            txtCvrNr_Kunde.Focus();
        }

        #endregion

        #region Update-metoder

        // hjælpemetode til at opdatere listview
        public void ListKundeUpdate()
        {
            lstKunder_Kunde.Items.Clear();

            IKundedata iKunder;
            IEnumerator iKundeIterator = system.GetKunder();
            iKundeIterator.Reset();

            while (iKundeIterator.MoveNext())
            {
                iKunder = (IKundedata)iKundeIterator.Current;

                ListViewItem line = new ListViewItem();

                line.Text = iKunder.KundeNr.ToString();
                line.SubItems.Add(iKunder.CvrNr.ToString());
                line.SubItems.Add(iKunder.Firmanavn);
                line.SubItems.Add(iKunder.Kontaktperson);
                line.SubItems.Add(iKunder.Email);
                line.SubItems.Add(iKunder.TlfNr.ToString());
                line.SubItems.Add(iKunder.Adresse);
                line.SubItems.Add(iKunder.Postnr.ToString());
                line.SubItems.Add(iKunder.Bynavn);

                lstKunder_Kunde.Items.Add(line);
            }
        }

        #endregion

        #region Knapper og clicks

        // opret-knappen
        private void btnOpret_Kunde_Click(object sender, EventArgs e)
        {
            txtKundeNr_Kunde.Clear();
            txtCvrNr_Kunde.Clear();
            txtFirmanavn_Kunde.Clear();
            txtKontaktperson_Kunde.Clear();
            txtEmail_Kunde.Clear();
            txtTlfNr_Kunde.Clear();
            txtAdresse_Kunde.Clear();
            txtPostnr_Kunde.Clear();
            txtBynavn_Kunde.Clear();

            OpretTilstand_Kunde();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu oprette en kunde.";
        }

        // rediger-knappen
        private void btnRediger_Kunde_Click(object sender, EventArgs e)
        {
            RedigerTilstand_Kunde();
        }

        // gem-knappen
        private void btnGem_Kunde_Click(object sender, EventArgs e)
        {
            int kundeNr, cvrNr, tlfNr, postnr;
            string firmanavn, kontaktperson, email, adresse, bynavn;
            bool res;

            // inputvalidering af cvrNr
            res = int.TryParse(txtCvrNr_Kunde.Text, out cvrNr);
            if (!res)
            {
                txtCvrNr_Kunde.Clear();
                txtCvrNr_Kunde.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst CVR nr. som heltal";
                return;
            }

            // inputvalidering af firmanavng
            firmanavn = txtFirmanavn_Kunde.Text;
            if (txtFirmanavn_Kunde.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst et firmanavn.";
                txtFirmanavn_Kunde.Focus();
                return;
            }

            // inputvalidering af kontaktperson
            kontaktperson = txtKontaktperson_Kunde.Text;
            if (txtKontaktperson_Kunde.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en kontaktperson.";
                txtKontaktperson_Kunde.Focus();
                return;
            }

            // inputvalidering af email
            email = txtEmail_Kunde.Text;
            if (txtEmail_Kunde.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en e-mail adresse.";
                txtEmail_Kunde.Focus();
                return;
            }

            // inputvalidering af tlfNr
            res = int.TryParse(txtTlfNr_Kunde.Text, out tlfNr);
            if (!res)
            {
                txtTlfNr_Kunde.Clear();
                txtTlfNr_Kunde.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst telefon nr. som heltal";
                return;
            }

            // inputvalidering af adresse
            adresse = txtAdresse_Kunde.Text;
            if (txtAdresse_Kunde.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en adresse.";
                txtAdresse_Kunde.Focus();
                return;
            }

            // inputvalidering af postnr
            res = int.TryParse(txtPostnr_Kunde.Text, out postnr);
            if (!res)
            {
                txtPostnr_Kunde.Clear();
                txtPostnr_Kunde.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst postnr som heltal";
                return;
            }

            // gem nyt kunde-objekt
            if (tilstandKunde == OPRET_TILSTAND)
            {
                res = system.OpretKunde(cvrNr, firmanavn, kontaktperson, email, tlfNr, adresse, postnr, out kundeNr, out bynavn);
                if (res == true)
                {
                    txtKundeNr_Kunde.Text = kundeNr.ToString();
                    txtBynavn_Kunde.Text = bynavn;
                    ListKundeUpdate();
                }
                else
                {
                    MessageBox.Show("Kunden kunne ikke oprettes pga. en systemfejl. Dette skyldes muligvis, at du har indtastet et ikke eksisterende postnr.");
                }
            }

            // gem redigeret kunde-objekt
            else  // tilstand = redigertilstand
            {
                kundeNr = Convert.ToInt32(txtKundeNr_Kunde.Text);

                res = system.RedigerKunde(kundeNr, cvrNr, firmanavn, kontaktperson, email, tlfNr, adresse, postnr, out bynavn);
                if (res == false)
                {
                    MessageBox.Show("Kunden kunne ikke redigeres pga. en systemfejl. Dette skyldes muligvis, at du har indtastet et ikke eksisterende postnr.");
                }
                else
                {
                    txtKundeNr_Kunde.Text = kundeNr.ToString();
                    txtBynavn_Kunde.Text = bynavn;
                    ListKundeUpdate();
                }
            }
            NormalTilstand_Kunde();
        }

        // fortryd-knappen
        private void btnFortryd_Kunde_Click(object sender, EventArgs e)
        {
            txtKundeNr_Kunde.Clear();
            txtCvrNr_Kunde.Clear();
            txtFirmanavn_Kunde.Clear();
            txtKontaktperson_Kunde.Clear();
            txtEmail_Kunde.Clear();
            txtTlfNr_Kunde.Clear();
            txtAdresse_Kunde.Clear();
            txtPostnr_Kunde.Clear();
            txtBynavn_Kunde.Clear();

            NormalTilstand_Kunde();
        }

        // Index changed Kunder listview
        private void lstKunder_Kunde_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstKunder_Kunde.SelectedItems.Count > 0)     // workaround
            {
                int selectedIndex = lstKunder_Kunde.SelectedIndices[0];   // Vælg første selected index

                ListViewItem line = lstKunder_Kunde.Items[selectedIndex];

                txtKundeNr_Kunde.Text = line.Text;
                txtCvrNr_Kunde.Text = line.SubItems[1].Text;
                txtFirmanavn_Kunde.Text = line.SubItems[2].Text;
                txtKontaktperson_Kunde.Text = line.SubItems[3].Text;
                txtEmail_Kunde.Text = line.SubItems[4].Text;
                txtTlfNr_Kunde.Text = line.SubItems[5].Text;
                txtAdresse_Kunde.Text = line.SubItems[6].Text;
                txtPostnr_Kunde.Text = line.SubItems[7].Text;
                txtBynavn_Kunde.Text = line.SubItems[8].Text;
            }

            btnRediger_Kunde.Visible = true;
        }

        #endregion

        #endregion

        /************************ Region "Håndter projekter" ************************/
        #region "Håndter projekter"

        #region Tilstandsstyring

        private void NormalTilstand_Projekt()
        {
            tilstandProjekt = NORMAL_TILSTAND;

            txtProjektNr_Projekt.ReadOnly = true;
            txtTitel_Projekt.ReadOnly = true;
            lstKunder_Kunde.Enabled = false;
            dtpStartTidspunkt_Projekt.Enabled = false;
            cboProjektFase_Projekt.Enabled = false;
            dtpSluttidspunkt_Projekt.Enabled = false;
            txtDeadline_Projekt.ReadOnly = true;
            cboAktiv_Projekt.Enabled = false;
            cboProjektleder_Projekt.Enabled = false;

            lstProjekter_Projekt.Enabled = true;

            btnOpret_Projekt.Visible = true;
            btnRediger_Projekt.Visible = false;
            btnGem_Projekt.Visible = false;
            btnFortryd_Projekt.Visible = false;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Klar.";
        }

        private void OpretTilstand_Projekt()
        {
            tilstandProjekt = OPRET_TILSTAND;

            txtProjektNr_Projekt.ReadOnly = true;
            txtTitel_Projekt.ReadOnly = false;
            lstKunder_Kunde.Enabled = true;
            dtpStartTidspunkt_Projekt.Enabled = true;
            cboProjektFase_Projekt.Enabled = true;
            dtpSluttidspunkt_Projekt.Enabled = false;
            txtDeadline_Projekt.ReadOnly = false;
            cboAktiv_Projekt.Enabled = true;
            cboProjektleder_Projekt.Enabled = true;

            lstProjekter_Projekt.Enabled = false;

            btnOpret_Projekt.Visible = false;
            btnRediger_Projekt.Visible = false;
            btnGem_Projekt.Visible = true;
            btnFortryd_Projekt.Visible = true;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu oprette et projekt.";
        }

        private void RedigerTilstand_Projekt()
        {
            tilstandProjekt = REDIGER_TILSTAND;

            txtProjektNr_Projekt.ReadOnly = true;
            txtTitel_Projekt.ReadOnly = false;
            lstKunder_Kunde.Enabled = true;
            dtpStartTidspunkt_Projekt.Enabled = true;
            cboProjektFase_Projekt.Enabled = true;
            dtpSluttidspunkt_Projekt.Enabled = true;
            txtDeadline_Projekt.ReadOnly = false;
            cboAktiv_Projekt.Enabled = true;
            cboProjektleder_Projekt.Enabled = true;

            lstProjekter_Projekt.Enabled = false;

            btnOpret_Projekt.Visible = false;
            btnRediger_Projekt.Visible = false;
            btnGem_Projekt.Visible = true;
            btnFortryd_Projekt.Visible = true;

            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu redigere projektet.";
        }

        #endregion

        #region Update metoder

        // hjælpemetode til at opdatere projekter listview
        public void ListProjektUpdate()
        {
            lstProjekter_Projekt.Items.Clear();

            IProjektdata iProjekt;
            IEnumerator iProjektIterator = system.GetProjekter();
            iProjektIterator.Reset();

            while (iProjektIterator.MoveNext())
            {
                iProjekt = (IProjektdata)iProjektIterator.Current;

                // hent associeret kunde og medarbejder
                IKundedata minIKunde = system.GetMinKunde(iProjekt.ProjektNr);
                IMedarbejderdata minIProjektleder = system.GetMinProjektleder(iProjekt.ProjektNr);

                // opdater projektets tidsforbrug
                bool res = system.OpdaterProjektsTidsforbrug(iProjekt.ProjektNr);
                if (res == false)
                {
                    lblStatus.ForeColor = Color.Red;
                    lblStatus.Text = "Projekternes tidsforbrug er ikke opdaterede pga. en systemfejl";
                }

                ListViewItem line = new ListViewItem();

                line.Text = iProjekt.ProjektNr.ToString();
                line.SubItems.Add(iProjekt.Titel.ToString());
                line.SubItems.Add(minIKunde.Firmanavn);
                line.SubItems.Add(minIProjektleder.Navn);
                line.SubItems.Add(iProjekt.Starttidspunkt.ToString());
                line.SubItems.Add(iProjekt.Projektfase);
                line.SubItems.Add(iProjekt.Deadline.ToString());
                line.SubItems.Add(iProjekt.Tidsforbrug.ToString());
                line.SubItems.Add(iProjekt.Sluttidspunkt.ToString());
                if (iProjekt.Aktiv == true)
                {
                    line.SubItems.Add("Ja");
                }
                else
                {
                    line.SubItems.Add("Nej");
                }
                lstProjekter_Projekt.Items.Add(line);
            }
        }

        // hjælpemetode til at opdatere kunde listview
        public void ListProjektKundeUpdate()
        {
            lstKunde_Projekt.Items.Clear();

            IKundedata iKunder;
            IEnumerator iKundeIterator = system.GetKunder();
            iKundeIterator.Reset();

            while (iKundeIterator.MoveNext())
            {
                iKunder = (IKundedata)iKundeIterator.Current;

                ListViewItem line = new ListViewItem();

                line.Text = iKunder.KundeNr.ToString();
                line.SubItems.Add(iKunder.Firmanavn);

                lstKunde_Projekt.Items.Add(line);
            }
        }

        // hjælpemetode til at opdatere projektleder comboboks
        public void cboUpdateProjektledere()
        {
            cboProjektleder_Projekt.Items.Clear();

            IMedarbejderdata iMedarbejder;
            IEnumerator iMedarbejderIterator = system.GetMedarbejdere();
            iMedarbejderIterator.Reset();

            while (iMedarbejderIterator.MoveNext())
            {
                iMedarbejder = (IMedarbejderdata)iMedarbejderIterator.Current;

                cboProjektleder_Projekt.Items.Add(iMedarbejder.Navn);
            }
        }

        #endregion

        #region Knapper og clicks

        // opret-knappen
        private void btnOpret_Projekt_Click(object sender, EventArgs e)
        {
            ListProjektKundeUpdate();
            cboUpdateProjektledere();

            txtProjektNr_Projekt.Clear();
            txtTitel_Projekt.Clear();
            dtpStartTidspunkt_Projekt.Value = DateTime.Now;
            txtDeadline_Projekt.Clear();
            cboProjektFase_Projekt.SelectedItem = null;
            dtpSluttidspunkt_Projekt.Value = DateTime.Now;
            cboAktiv_Projekt.SelectedItem = null;

            OpretTilstand_Projekt();
            lblStatus.ForeColor = Color.Green;
            lblStatus.Text = "Du kan nu oprette et projekt.";
        }

        // rediger-knappen
        private void btnRediger_Projekt_Click(object sender, EventArgs e)
        {
            ListProjektKundeUpdate();
            cboUpdateProjektledere();

            RedigerTilstand_Projekt();
        }

        // gem-knappen
        private void btnGem_Projekt_Click(object sender, EventArgs e)
        {
            int projektNr, kundeNr, projektlederNr;
            DateTime starttidspunkt, sluttidspunkt;
            string titel, projektfase, deadline;
            bool res, aktiv;

            // inputvalidering af titel
            titel = txtTitel_Projekt.Text;
            if (txtTitel_Projekt.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en titel.";
                txtTitel_Projekt.Focus();
                return;
            }

            // inputvalidering af kundeNr
            if (lstKunde_Projekt.SelectedItems.Count > 0)     // workaround
            {
                int selectedIndex = lstKunde_Projekt.SelectedIndices[0];   // Vælg første selected index
                ListViewItem line = lstKunde_Projekt.Items[selectedIndex];
                kundeNr = Convert.ToInt32(line.Text);
            }
            else
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst en kunde.";
                lstKunde_Projekt.Focus();
                return;
            }

            starttidspunkt = dtpStartTidspunkt_Projekt.Value.Date;

            // inputvalidering af projektfase
            if (cboProjektFase_Projekt.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst en projektfase.";
                cboProjektFase_Projekt.Focus();
                return;
            }
            else
            {
                projektfase = cboProjektFase_Projekt.SelectedItem.ToString();
            }

            // inputvalidering af deadline
            deadline = txtDeadline_Projekt.Text;
            if (txtTitel_Projekt.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en deadline.";
                txtDeadline_Projekt.Focus();
                return;
            }

            // inputvalidering af projektleder
            if (cboProjektleder_Projekt.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst en projektleder.";
                cboProjektleder_Projekt.Focus();
                return;
            }
            else
            {
                string projektlederNavn = cboProjektleder_Projekt.SelectedItem.ToString();
                projektlederNr = system.GetMedarbNr(projektlederNavn);
            }

            // gem nyt projekt-objekt
            if (tilstandProjekt == OPRET_TILSTAND)
            {
                res = system.OpretProjekt(titel, starttidspunkt, projektfase, deadline, projektlederNr, kundeNr, out projektNr);
                if (res == true)
                {
                    txtProjektNr_Projekt.Text = projektNr.ToString();
                    ListProjektUpdate();
                }
                else
                {
                    lblStatus.ForeColor = Color.Red;
                    lblStatus.Text = "Projektet kunne ikke oprettes pga. en systemfejl.";
                }
            }

            // gem redigeret projekt-objekt
            else  // tilstand = redigertilstand
            {
                projektNr = Convert.ToInt32(txtProjektNr_Projekt.Text);
                sluttidspunkt = dtpStartTidspunkt_Projekt.Value;

                // inputvalidering af aktiv
                if (cboAktiv_Projekt.SelectedItem == null)
                {
                    lblStatus.ForeColor = Color.Red;
                    lblStatus.Text = "Anfør venligst hvorvidt der arbejdes på projektet eller ej.";
                    cboAktiv_Projekt.Focus();
                    return;
                }
                else
                {
                    if (cboAktiv_Projekt.SelectedItem.ToString() == "Ja")
                    {
                        aktiv = true;
                    }
                    else
                    {
                        aktiv = false;
                    }
                }

                res = system.RedigerProjekt(projektNr, titel, starttidspunkt, projektfase, deadline, sluttidspunkt, aktiv, kundeNr, projektlederNr);
                if (res == false)
                {
                    lblStatus.ForeColor = Color.Red;
                    lblStatus.Text = "Projektet kunne ikke redigeres pga. en systemfejl.";
                }
                else
                {
                    txtProjektNr_Projekt.Text = projektNr.ToString();
                    ListProjektUpdate();
                }
            }

            txtProjektNr_Projekt.Clear();
            txtTitel_Projekt.Clear();
            dtpStartTidspunkt_Projekt.Value = DateTime.Now;
            txtDeadline_Projekt.Clear();
            cboProjektFase_Projekt.SelectedItem = null;
            dtpSluttidspunkt_Projekt.Value = DateTime.Now;
            cboAktiv_Projekt.SelectedItem = null;

            NormalTilstand_Projekt();
        }

        // fortryd-knappen
        private void btnFortryd_Projekt_Click(object sender, EventArgs e)
        {
            txtProjektNr_Projekt.Clear();
            txtTitel_Projekt.Clear();
            dtpStartTidspunkt_Projekt.Value = DateTime.Now;
            txtDeadline_Projekt.Clear();
            cboProjektFase_Projekt.SelectedItem = null;
            dtpSluttidspunkt_Projekt.Value = DateTime.Now;
            cboAktiv_Projekt.SelectedItem = null;

            NormalTilstand_Projekt();
        }

        // Index changed "projekter" listview
        private void lstProjekter_Projekt_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstProjekter_Projekt.SelectedItems.Count > 0)     // workaround
            {
                int selectedIndex = lstProjekter_Projekt.SelectedIndices[0];   // Vælg første selected index
                ListViewItem line = lstProjekter_Projekt.Items[selectedIndex];

                txtProjektNr_Projekt.Text = line.Text;
                txtTitel_Projekt.Text = line.SubItems[1].Text;
                dtpStartTidspunkt_Projekt.Value = Convert.ToDateTime(line.SubItems[4].Text);
                txtDeadline_Projekt.Text = line.SubItems[6].Text;
                dtpSluttidspunkt_Projekt.Value = Convert.ToDateTime(line.SubItems[8].Text);
                if (line.SubItems[9].Text == "Ja")
                {
                    cboAktiv_Projekt.SelectedItem = cboAktiv_Projekt.Items[0];
                }
                else
                {
                    cboAktiv_Projekt.SelectedItem = cboAktiv_Projekt.Items[1];
                }
            }

            btnRediger_Projekt.Visible = true;
        }

        #endregion

        #endregion

        /************************ Region "Send faktura" ************************/
        #region "Send faktura"

        #region Tilstandsstyring

        // Betingelser for normal-tilstand
        private void NormalTilstand_Faktura()
        {
            txtFakturaNr.ReadOnly = true;
            txtValutaType_Faktura.ReadOnly = true;
            dtpFakturadato_Faktura.Enabled = false;
            dtpLeveringsdato_Faktura.Enabled = false;
            dtpBetalingsdato_Faktura.Enabled = false;
            txtBetalingsmetode_Faktura.ReadOnly = true;
            txtBesked_Faktura.ReadOnly = true;
            cboProjekt_Faktura.Enabled = false;
            txtVarebeskrivelse_Faktura.ReadOnly = true;
            txtAntal_Faktura.ReadOnly = true;
            cboEnhed_Faktura.Enabled = false;
            txtPrisPrEnhedEkskl_Faktura.ReadOnly = true;
            cboMoms_Faktura.Enabled = false;
            lstVarer_Faktura.Enabled = false;
            lstFakturaer_Faktura.Enabled = true;

            btnTilføjVare_Faktura.Enabled = false;
            btnOpretFaktura_Faktura.Enabled = true;
            btnGem_Faktura.Enabled = false;
            btnFortryd_Faktura.Enabled = true;
            btnVisFaktura_Faktura.Enabled = true;
        }

        // Betingelser for opret-tilstand
        private void OpretTilstand_Faktura()
        {
            txtFakturaNr.ReadOnly = true;
            txtValutaType_Faktura.ReadOnly = false;
            dtpFakturadato_Faktura.Enabled = true;
            dtpLeveringsdato_Faktura.Enabled = true;
            dtpBetalingsdato_Faktura.Enabled = true;
            txtBetalingsmetode_Faktura.ReadOnly = false;
            txtBesked_Faktura.ReadOnly = false;
            cboProjekt_Faktura.Enabled = true;
            txtVarebeskrivelse_Faktura.ReadOnly = false;
            txtAntal_Faktura.ReadOnly = false;
            cboEnhed_Faktura.Enabled = true;
            txtPrisPrEnhedEkskl_Faktura.ReadOnly = false;
            cboMoms_Faktura.Enabled = true;
            lstVarer_Faktura.Enabled = true;
            lstFakturaer_Faktura.Enabled = false;

            btnTilføjVare_Faktura.Enabled = true;
            btnOpretFaktura_Faktura.Enabled = false;
            btnGem_Faktura.Enabled = true;
            btnFortryd_Faktura.Enabled = true;
            btnVisFaktura_Faktura.Enabled = false;
        }

        #endregion

        #region Update-metode

        // hjælpemetode til at opdatere comboboks med projekter
        public void CboUpdateProjektvalg()
        {
            cboProjekt_Faktura.Items.Clear();

            IProjektdata iProjekt;
            IEnumerator iProjektIterator = system.GetProjekter();
            iProjektIterator.Reset();

            while (iProjektIterator.MoveNext())
            {
                iProjekt = (IProjektdata)iProjektIterator.Current;

                cboProjekt_Faktura.Items.Add(iProjekt.Titel);
            }
        }

        // hjælpemetode til at opdatere listview med fakturaer
        public void ListUpdateFaktura()
        {
            lstFakturaer_Faktura.Items.Clear();

            IFakturadata iFaktura;
            IEnumerator iFakturaIterator = system.GetFakturaer();
            iFakturaIterator.Reset();

            while (iFakturaIterator.MoveNext())
            {
                iFaktura = (IFakturadata)iFakturaIterator.Current;

                int antalVarer = system.GetAntalVarer(iFaktura.FakturaNr);

                ListViewItem line = new ListViewItem();
                line.Text = iFaktura.FakturaNr.ToString();
                line.SubItems.Add(iFaktura.ValutaType);
                line.SubItems.Add(iFaktura.Fakturadato.ToString());
                line.SubItems.Add(iFaktura.Leveringsdato.ToString());
                line.SubItems.Add(iFaktura.Betalingsdato.ToString());
                line.SubItems.Add(iFaktura.Betalingsmetode);
                line.SubItems.Add(iFaktura.Besked);
                line.SubItems.Add(antalVarer.ToString());
                lstFakturaer_Faktura.Items.Add(line);
            }
        }

        #endregion

        #region Knapper og Clicks

        // tilføj vare-knap
        private void btnTilføjVare_Faktura_Click(object sender, EventArgs e)
        {
            string varebeskrivelse, enhed;
            int antal;
            double prisPrEnhedEkskl, moms, varetotalEkskl;
            bool res;

            // inputvalidering af varebeskrivelse
            varebeskrivelse = txtVarebeskrivelse_Faktura.Text;
            if (txtVarebeskrivelse_Faktura.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en varebeskrivelse.";
                txtVarebeskrivelse_Faktura.Focus();
                return;
            }

            // inputvalidering af antal
            res = int.TryParse(txtAntal_Faktura.Text, out antal);
            if (!res)
            {
                txtAntal_Faktura.Clear();
                txtAntal_Faktura.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst antal som heltal";
                return;
            }

            // inputvalidering af enhed
            if (cboEnhed_Faktura.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst en enhed.";
                cboEnhed_Faktura.Focus();
                return;
            }
            else
            {
                enhed = cboEnhed_Faktura.SelectedItem.ToString();
            }

            // inputvalidering af prisPrEnhedEkskl
            res = double.TryParse(txtPrisPrEnhedEkskl_Faktura.Text, out prisPrEnhedEkskl);
            if (!res)
            {
                txtPrisPrEnhedEkskl_Faktura.Clear();
                txtPrisPrEnhedEkskl_Faktura.Focus();
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst prisen pr. enhed ekskl. moms som tal.";
                return;
            }

            // inputvalidering af moms
            if (cboMoms_Faktura.SelectedItem == null)
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst moms til eller fra.";
                cboMoms_Faktura.Focus();
                return;
            }
            else
            {
                enhed = cboEnhed_Faktura.SelectedItem.ToString();
            }
            if (cboMoms_Faktura.SelectedItem.ToString() == "Moms 0%")
            {
                moms = 0;
            }
            else
            {
                moms = 25;
            }

            varetotalEkskl = antal * prisPrEnhedEkskl;

            ListViewItem line = new ListViewItem();
            line.Text = "";
            line.SubItems.Add(varebeskrivelse);
            line.SubItems.Add(antal.ToString());
            line.SubItems.Add(enhed);
            line.SubItems.Add(prisPrEnhedEkskl.ToString());
            line.SubItems.Add(moms.ToString());
            line.SubItems.Add(varetotalEkskl.ToString());
            lstVarer_Faktura.Items.Add(line);
        }

        // opret faktura-knappen
        private void btnOpretFaktura_Faktura_Click(object sender, EventArgs e)
        {
            txtFakturaNr.Clear();
            txtValutaType_Faktura.Clear();
            dtpFakturadato_Faktura.Value = DateTime.Now;
            dtpLeveringsdato_Faktura.Value = DateTime.Now;
            dtpBetalingsdato_Faktura.Value = DateTime.Now;
            txtBetalingsmetode_Faktura.Clear();
            txtBesked_Faktura.Clear();
            cboProjekt_Faktura.SelectedItem = null;
            txtVarebeskrivelse_Faktura.Clear();
            txtAntal_Faktura.Clear();
            cboEnhed_Faktura.SelectedItem = null;
            txtPrisPrEnhedEkskl_Faktura.Clear();
            cboMoms_Faktura.SelectedItem = null;
            lstVarer_Faktura.Items.Clear();

            CboUpdateProjektvalg();
            OpretTilstand_Faktura();
        }

        // gem-knappen
        private void btnGem_Faktura_Click(object sender, EventArgs e)
        {
            int fakturaNr, antal, vareID;
            string valutaType, varebeskrivelse, enhed, betalingsmetode, besked;
            DateTime fakturadato, leveringsdato, betalingsdato;
            double prisPrEnhedEkskl, moms, varetotalEkskl;

            // inputvalidering af valutaType
            valutaType = txtValutaType_Faktura.Text;
            if (txtValutaType_Faktura.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en valuta.";
                txtValutaType_Faktura.Focus();
                return;
            }

            // inputvalidering af betalingsmetode
            betalingsmetode = txtBetalingsmetode_Faktura.Text;
            if (txtBetalingsmetode_Faktura.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en betalingsmetode.";
                txtBetalingsmetode_Faktura.Focus();
                return;
            }

            // inputvalidering af besked
            besked = txtBesked_Faktura.Text;
            if (txtBesked_Faktura.Text == "")
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Indtast venligst en besked.";
                txtBesked_Faktura.Focus();
                return;
            }

            fakturadato = dtpFakturadato_Faktura.Value.Date;
            leveringsdato = dtpLeveringsdato_Faktura.Value.Date;
            betalingsdato = dtpBetalingsdato_Faktura.Value.Date;

            if (system.OpretFaktura(valutaType, fakturadato, leveringsdato, betalingsdato, betalingsmetode, besked, out fakturaNr))
            {
                foreach (ListViewItem item in lstVarer_Faktura.Items)
                {
                    varebeskrivelse = item.SubItems[1].Text;
                    antal = Convert.ToInt32(item.SubItems[2].Text);
                    enhed = item.SubItems[3].Text;
                    prisPrEnhedEkskl = Convert.ToDouble(item.SubItems[4].Text);
                    moms = Convert.ToDouble(item.SubItems[5].Text);
                    varetotalEkskl = Convert.ToDouble(item.SubItems[6].Text);

                    if (system.OpretVare(fakturaNr, varebeskrivelse, antal, enhed, prisPrEnhedEkskl, moms, varetotalEkskl, out vareID))
                    {
                        item.Text = vareID.ToString();
                        txtFakturaNr.Text = fakturaNr.ToString();
                    }
                    else
                    {
                        lblStatus.ForeColor = Color.Red;
                        lblStatus.Text = "En af varerne kunne ikke gemmes pga. en systemfejl.";
                        return;
                    }
                }

                // clear felter
                txtFakturaNr.Clear();
                txtValutaType_Faktura.Clear();
                dtpFakturadato_Faktura.Value = DateTime.Now;
                dtpLeveringsdato_Faktura.Value = DateTime.Now;
                dtpBetalingsdato_Faktura.Value = DateTime.Now;
                txtBetalingsmetode_Faktura.Clear();
                txtBesked_Faktura.Clear();
                cboProjekt_Faktura.SelectedItem = null;
                txtVarebeskrivelse_Faktura.Clear();
                txtAntal_Faktura.Clear();
                cboEnhed_Faktura.SelectedItem = null;
                txtPrisPrEnhedEkskl_Faktura.Clear();
                cboMoms_Faktura.SelectedItem = null;
                lstVarer_Faktura.Items.Clear();

                ListUpdateFaktura();
                NormalTilstand_Faktura();

                lblStatus.ForeColor = Color.Green;
                lblStatus.Text = "Fakturaen er gemt og kan nu vises.";
            }
            else
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Fakturaen kunne ikke gemmes pga. en systemfejl.";
            }
        }

        // fortryd-knappen
        private void btnFortryd_Faktura_Click(object sender, EventArgs e)
        {
            // clear felter
            txtFakturaNr.Clear();
            txtValutaType_Faktura.Clear();
            dtpFakturadato_Faktura.Value = DateTime.Now;
            dtpLeveringsdato_Faktura.Value = DateTime.Now;
            dtpBetalingsdato_Faktura.Value = DateTime.Now;
            txtBetalingsmetode_Faktura.Clear();
            txtBesked_Faktura.Clear();
            cboProjekt_Faktura.SelectedItem = null;
            txtVarebeskrivelse_Faktura.Clear();
            txtAntal_Faktura.Clear();
            cboEnhed_Faktura.SelectedItem = null;
            txtPrisPrEnhedEkskl_Faktura.Clear();
            cboMoms_Faktura.SelectedItem = null;
            lstVarer_Faktura.Items.Clear();

            NormalTilstand_Faktura();
        }

        // vis faktura-knappen
        private void btnVisFaktura_Faktura_Click(object sender, EventArgs e)
        {
            int fakturaNr = 0;

            if (lstFakturaer_Faktura.SelectedItems.Count > 0)     // workaround
            {
                int selectedIndex = lstFakturaer_Faktura.SelectedIndices[0];   // Vælg første selected index
                ListViewItem line = lstFakturaer_Faktura.Items[selectedIndex];

                fakturaNr = Convert.ToInt32(line.Text);
            }
            else
            {
                lblStatus.ForeColor = Color.Red;
                lblStatus.Text = "Vælg venligst den faktura som du ønsker at se.";
                return;
            }

            FrmFakturaRap frmFakturaRap = new FrmFakturaRap(system, fakturaNr);
            this.Hide();
            frmFakturaRap.ShowDialog();
            this.Show();
        }

        // når der vælges et projekt...
        private void cboProjekt_Faktura_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboProjekt_Faktura.SelectedItem != null)
            {
                IProjektdata iProjekt;
                IEnumerator iProjektIterator = system.GetProjekter();
                iProjektIterator.Reset();

                while (iProjektIterator.MoveNext())
                {
                    iProjekt = (IProjektdata)iProjektIterator.Current;

                    if (iProjekt.Titel == cboProjekt_Faktura.SelectedItem.ToString())
                    {
                        txtVarebeskrivelse_Faktura.Text = iProjekt.Titel;
                        int tal = 1;
                        txtAntal_Faktura.Text = tal.ToString();
                        cboEnhed_Faktura.SelectedItem = cboEnhed_Faktura.Items[0];
                        cboMoms_Faktura.SelectedItem = cboMoms_Faktura.Items[1];
                        return;
                    }
                }
            }
        }

        // når der vælges en faktura fra listviewet med fakturaer...
        private void lstFakturaer_Faktura_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstFakturaer_Faktura.SelectedItems.Count > 0)     // workaround
            {
                int selectedIndex = lstFakturaer_Faktura.SelectedIndices[0];   // Vælg første selected index
                ListViewItem line = lstFakturaer_Faktura.Items[selectedIndex];

                txtFakturaNr.Text = line.Text;
                txtValutaType_Faktura.Text = line.SubItems[1].Text;
                dtpFakturadato_Faktura.Value = Convert.ToDateTime(line.SubItems[2].Text);
                dtpLeveringsdato_Faktura.Value = Convert.ToDateTime(line.SubItems[3].Text);
                dtpBetalingsdato_Faktura.Value = Convert.ToDateTime(line.SubItems[4].Text);
                txtBetalingsmetode_Faktura.Text = line.SubItems[5].Text;
                txtBesked_Faktura.Text = line.SubItems[6].Text;

                lstVarer_Faktura.Items.Clear();

                IVaredata iVare;
                IEnumerator iVareIterator = system.GetVarer(Convert.ToInt32(txtFakturaNr.Text));
                iVareIterator.Reset();

                while (iVareIterator.MoveNext())
                {
                    iVare = (IVaredata)iVareIterator.Current;

                    line = new ListViewItem();
                    line.Text = iVare.VareID.ToString();
                    line.SubItems.Add(iVare.Varebeskrivelse);
                    line.SubItems.Add(iVare.Antal.ToString());
                    line.SubItems.Add(iVare.Enhed);
                    line.SubItems.Add(iVare.PrisPrEnhedEkskl.ToString());
                    line.SubItems.Add(iVare.Moms.ToString());
                    line.SubItems.Add(iVare.VaretotalEkskl.ToString());
                    lstVarer_Faktura.Items.Add(line);
                }
            }
        }

        #endregion

        #endregion
    }
}
